package ltd.hxya.novel.book.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import ltd.hxya.novel.book.dto.*;
import ltd.hxya.novel.book.entity.Book;
import ltd.hxya.novel.book.entity.BookCategory;
import ltd.hxya.novel.book.entity.BookInfo;
import ltd.hxya.novel.book.utils.resp.RestResp;
import ltd.hxya.novel.book.vo.BookAndRankVo;
import ltd.hxya.novel.book.vo.BookIndexVo;
import ltd.hxya.novel.common.bean.Result;
import ltd.hxya.novel.common.to.book.BookChapterTo;
import ltd.hxya.novel.common.to.book.BookTo;
import ltd.hxya.novel.common.vo.PageParam;
import ltd.hxya.novel.common.vo.SearchParam;
import ltd.hxya.novel.book.vo.BookVo;
import ltd.hxya.novel.entity.rowdata.DataPart;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * <p>
 * 小说表 服务类
 * </p>
 *
 * @author hxya
 * @since 2022-09-13
 */
public interface IBookService extends IService<Book> {

    Page<BookVo> listBlank(SearchParam param);

    void addVisitCount(Long bookId);

//    List<BookVo> listBookByCondition(SearchParam bookParam) throws IOException;

    BookAndRankVo listBookByRank(Long typeId);

    List<BookVo> listAllBook();

    BookVo bookInfoById(String bookId);

    List<BookTo> bookListByBatchId(List<Long> batchId);

    void updateLastIndex(List<BookChapterTo> bookChapterTos);

    Book saveBookInfo(Book book) throws ExecutionException, InterruptedException;

    Page<Book> listBook(Book book);


    Page<Book> uncategoryBook(Long categoryId);

    void addBook(String bookId, String categoryId);

    Page<BookCategory> unaddCategory(String bookId);

    List<Book> isAdd(Book book);

    void deleteById(String[] ids);

    //BookIndexVo bookIndex(String bookId) throws Executionxnai Exception, InterruptedException;

    BookIndexVo bookIndex(String bookId) throws ExecutionException, InterruptedException;

    void updateBook(Book book);

    void disableBookByCategory(Integer categoryId);

    void changeBookStatus(String id, Boolean status);

    void saveBook(List<DataPart> dataParts);

    /**
     * 小说新书榜查询接口 ok
     */
    Result<List<BookRankRespDto>> listNewestRankBooks();

    /**
     * 小说点击榜查询接口 ok
     */
    Result<List<BookRankRespDto>> listVisitRankBooks();

    /**
     * 小说更新榜查询接口 ok
     */
    Result<List<BookRankRespDto>> listUpdateRankBooks();

    /**
     * 小说推荐列表查询接口,根据id查询信息
     */
    Result<List<BookInfoRespDto>> listRecBooks(Long bookId);
    /**
     * 小说信息查询接口
     */
    Result<BookInfoRespDto> getBookById(String bookId,String token);

    /**
     * 小说最新章节相关信息查询接口
     */
    Result<BookChapterAboutRespDto> getLastChapterAbout(String bookId,String token);
    /**
     * 获取上一章节ID接口
     */
    Result<String> getPreChapterId(String chapterId, String token);
    /**
     * 获取下一章节ID接口
     */
    Result<String> getNextChapterId(String chapterId,String token);

    /**
     * 小说内容相关信息查询接口,根据章节id，来查询章节的一些信息
     */
    Result<BookContentAboutRespDto> getBookContentAbout(String chapterId,String token);
    /**
     * 小说搜索接口
     * @param condition  传的是一个查询条件的一个对象
     * @return 分页数据的集合
     */
    //RestResp<PageRespDto<BookInfoRespDto>> searchBooks(BookSearchReqDto condition);
    /**
     * 小说分类列表查询接口
     */
    Result<List<BookCategoryRespDto>> listCategory(Integer workDirection);

    void bookRecommend();


    /**
     * 查出来后返回的是BookInfo
     * @param id
     * @return
     */
    BookInfo selectById(String id);

    Page<Book> searchBooks(SearchParam searchParam) throws IOException;
}
